import logging
import HuffmanSourceCoder


def encode(args):
    """
    运行编码命令

    @param args: 命令行参数
    """
    # 输出命令信息
    logging.info(f'Running Huffman Encoder')
    logging.info(f'PMF:{args.PMF} INPUT:{args.INPUT}, OUTPUT:{args.OUTPUT}')
    # 进行编码操作
    input_len, output_len = HuffmanSourceCoder.encode(args.PMF ,args.INPUT, args. OUTPUT)
    # 输出编码前后文件字节大小
    logging.debug(
        f'Input File Size: {input_len} byte(s), Output File Size: {output_len} byte(s)')


def decode(args):
    """
    运行解码命令
    
    @param args: 命令行参数
    """
    # 输出命令信息
    logging.info(f'Running Huffman Decoder')
    logging.info(f'INPUT:{args.INPUT}, OUTPUT:{args.OUTPUT}')
    # 进行解码操作
    input_len, output_len = HuffmanSourceCoder.decode(args.INPUT, args. OUTPUT)
    # 输出解码前后文件字节大小
    logging.debug(
        f'Input File Size: {input_len} byte(s), Output File Size: {output_len} byte(s)')


def parse_args():
    """
    处理命令行输入

    参数:
    byteSourceCoder encode PMF INPUT OUTPUT
        PMF    - path to probability mass function CSV file
        INPUT  - path to the encoder input file
        OUTPUT - path to the encoder output file
    byteSourceCoder decode INPUT OUTPUT
        INPUT  - path to the decoder input file
        OUTPUT -  path to the decoder output file
    """
    import argparse
    import pathlib

    # 编解码命令解析
    operation_parser = argparse.ArgumentParser()
    # test 参数, 是否运行自动测试
    operation_parser.add_argument('-t', '--test', action="store_true",
                                  help='run tests')
    # verbose 参数, 用于控制log等级
    operation_parser.add_argument('-v', '--verbose', action="store_true",
                        help='show debug message')

    # 添加子命令
    subparsers = operation_parser.add_subparsers()

    # 编码子命令
    encode_parser = subparsers.add_parser('encode',
                                          help='Encode a file using Huffman Codec')
    # PMF 参数, 需要编码文件路径
    encode_parser.add_argument(
        'PMF', help='path to probability mass function CSV file', type=pathlib.Path)
    # Input 参数, 需要编码文件路径
    encode_parser.add_argument(
        'INPUT', help='path to the encoder input file', type=pathlib.Path)
    # Output 参数, 编码后的文件路径
    encode_parser.add_argument(
        'OUTPUT', help='path to the encoder output file', type=pathlib.Path)
    encode_parser.set_defaults(func=encode)

    # 解码子命令
    decode_parser = subparsers.add_parser('decode',
                                          help='Decode a file using Huffman Codec')
    # Input 参数, 需要解码文件路径
    decode_parser.add_argument(
        'INPUT', help='path to the decoder input file', type=pathlib.Path)
    # Output 参数, 解码后的文件路径
    decode_parser.add_argument(
        'OUTPUT', help='path to the decoder output file', type=pathlib.Path)
    decode_parser.set_defaults(func=decode)

    # 处理输入的命令
    args = operation_parser.parse_args()

    # 配置日志输出等级
    logging.basicConfig(level=logging.DEBUG if args.verbose else logging.INFO)

    # 判断是否进行单元测试
    if args.test:
        logging.info('Begin Unit Test')
        import subprocess
        subprocess.call(['python', 'TestByteSourceCoder.py'])
    elif args.func:
        # 运行子命令
        args.func(args)


if __name__ == '__main__':
    parse_args()
